#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
#include <set>
#include <climits>
#include <cassert>
#include <cctype>
using namespace std;

typedef long long ll;
typedef double dbl;
typedef long double ld;

#define mp make_pair
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define X first
#define Y second

const int maxn = 1000 * 100 + 1;
const dbl eps = (dbl)1e-6;
const int mod = 1e9 + 7;

ll dp[2010][2010], sum[2010][2010], c[2010];

ll f(int u, int d, int c) {
	return (((sum[d][c] - sum[u][c]) % mod + mod) % mod + dp[u][c]) % mod;
}

ll ppow(ll a, ll b) {
	if (b == 0) return 1;
	if (b % 2 == 0) {
		ll t = ppow(a, b / 2) % mod;
		return (t * t) % mod;
	} else {
		return (ppow(a, b - 1) * a) % mod;
	}
}

int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	
	while (true) {
		int n, x;
		ll d;
		scanf("%d%lld%d", &n, &d, &x);
		if (n == 0 && x == 0 && d == 0) break;
		if (x == 1) {
			printf("0\n");
			continue;
		}

		for (int i = 1; i <= x - 1; i++) {
			dp[i][1] = 1;
			sum[i][1] = i;
		}
		for (int i = x; i <= n; i++) {
			dp[i][1] = 0;
			sum[i][1] = x - 1;
		}
		for (int i = 2; i <= n; i++) {
			dp[1][i] = 0;
			sum[1][i] = 0;
		}
			
		for (int s = 2; s <= n; s++) {
			for (int t = 2; t <= n; t++) {
				dp[s][t] = f(max(s - x + 1, 1), s - 1, t - 1);
				sum[s][t] = (sum[s - 1][t] + dp[s][t]) % mod;
			}
		}

		ll p1 = 1LL, p2 = 1LL;
		c[0] = 1;
		for (int i = 1; i <= min((ll)n, d); i++) {
			p1 = ((ll)p1 * (ll)(d - i + 1)) % mod;
			p2 = ((ll)p2 * (ll)(i)) % mod;
			c[i] = (ppow(p2, mod - 2) * p1) % mod;
		}

		ll ans = 0;
		for (int i = 1; i <= min((ll)n, d); i++) {
			ans = (ans + (((ll)dp[n][i] * (ll)c[i]) % mod)) % mod;
		}
		printf("%lld\n", ans);
	}
	return 0;
}